    org 100h        ; 告诉编译器程序加载到100H处
    mov ax, cs  ; 设置 DS和ES = CS
    mov ds, ax
    mov es, ax
    mov ss, ax  ; 设置堆栈指针
    mov sp, 100h - 4
    mov ax,0B800h           ; 文本窗口显存起始地址
    mov gs,ax               ; ES = B800h

Keyin: ; 读按键
    mov ah,0 ; 功能号
    int 16h ; 调用16H号中断
; 对ESC键：退出
    cmp al,1bh ; 比较AL中的键入字符与ESC字符（ASCII码为1BH）
    je goout; 相等跳转到“退出”标号处
    cmp al, 37 ; 左移
    je Mov_left
    cmp al, 39 ; 右移
    je Mov_right
    cmp al, 8  ; backspace
    je Backspace
    cmp al, 46 ; Delete
    je Delete
    cmp al, 36 ; Home
    je Home
    cmp al, 35 ; End
    je End
    cmp al, 45 ; Insert
    je Insert
Mov_left:
    ; 获取当前光标位置（返回的行列号分别在DH和DL中）
    mov ah, 3       ; 功能号
    mov bh, 0       ; 第0页
    int 10h         ; 调用10H号显示中断
    ; 设置光标位置
    mov ah, 2       ; 功能号
    mov bh, 0       ; 第0页
    ;mov dh, 0       ; 行号
    sub dl, 1       ; 列号
    int 10h         ; 显示中断
Mov_right:
    ; 获取当前光标位置（返回的行列号分别在DH和DL中）
    mov ah, 3       ; 功能号
    mov bh, 0       ; 第0页
    int 10h         ; 调用10H号显示中断
    ; 设置光标位置
    mov ah, 2       ; 功能号
    mov bh, 0       ; 第0页
    ;mov dh, 0       ; 行号
    add dl, 1       ; 列号
    int 10h         ; 显示中断
Backspace:
    
showch: ; 显示键入字符
    mov ah,0eh ; 功能号
    mov bl,0 ; 对文本方式置0
    int 10h ; 调用10H号中断
; 对回车符（0DH）增加一个换行符（0AH）的显示
    cmp al,0dh ; 比较AL中的键入字符与回车符（ASCII码为0DH）
    mov al,0ah ; 设置AL为换行符（ASCII码为0AH）
    je showch ; 相等跳转到前面的“显示键入字符”标号处
; 循环读显按键
    jmp Keyin ; 跳转到前面的“读按键”标号处
goout: ; 退出
    mov ax,4c00h    ; AH=4Ch（功能号，终止进程）、AL=0（返回代码）
    int 21h         ; DOS软中断

INSERT db 0
